package com.hrbxlh.util;

import com.google.common.base.Function;
import com.google.common.collect.Maps;
import org.apache.commons.collections.CollectionUtils;

import java.util.*;

/**
 * map操作工具类。
 * Created by zty .
 */
public class MapUtils {

    /**
     * 将集合类型转化为map类型。
     *
     * @param c    集合
     * @param func 转化函数
     * @param <K>  K类型
     * @param <V>  V类型，集合元素类型
     * @return 转化后的map
     */
    public static <K, V> Map<K, V> transform(Collection<V> c, Function<V, K> func) {

        if (CollectionUtils.isEmpty(c)) {
            return Collections.EMPTY_MAP;
        }

        Map<K, V> map = new HashMap<K, V>(c.size());
        for (V v : c) {
            map.put(func.apply(v), v);
        }

        return map;
    }

    /**
     * 将集合类型转化为map类型。
     *
     * @param c    集合
     * @param func 转化函数
     * @param <K>  K类型
     * @param <V>  V类型，集合元素类型
     * @return 转化后的map
     */
    public static <K, V> Map<K, List<V>> transformList(Collection<V> c, Function<V, K> func) {

        if (CollectionUtils.isEmpty(c)) {
            return Collections.EMPTY_MAP;
        }

        Map<K, List<V>> map = new HashMap<K, List<V>>(c.size());
        for (V v : c) {
            K key = func.apply(v);
            List<V> list = map.get(key);
            if (null == list) {
                list = new ArrayList<V>();
                map.put(key, list);
            }
            list.add(v);
        }

        return map;
    }

    public static boolean isEmpty(Map map) {
        return map == null || map.isEmpty();
    }

    /**
     * map转list。
     */
    public static <K, V, T> List<T> mapCastToList(Map<K, V> map, Function<Map.Entry<K, V>, T> fun) {

        if (isEmpty(map)) {
            return Collections.emptyList();
        }

        List<T> list = new ArrayList<T>(map.size());
        for (Map.Entry<K, V> entry : map.entrySet()) {
            list.add(fun.apply(entry));
        }

        return list;
    }


    /**
     * 将集合类型转化为map类型。取其中两个值当做key和value
     *
     * @param c    集合
     * @param func 转化函数
     * @param <K>  K类型
     * @param <V>  V类型，集合元素类型
     * @return 转化后的map
     */
    public static <K, V, Z> Map<K, Z> transformNew(Collection<V> c, Function<V, K> func, Function<V, Z> func1) {

        if (CollectionUtils.isEmpty(c)) {
            return Collections.EMPTY_MAP;
        }

        Map<K, Z> map = new HashMap<K, Z>(c.size());
        for (V v : c) {
            map.put(func.apply(v), func1.apply(v));
        }

        return map;
    }

    /**
     * 将集合类型转化为map类型。取其中两个值当做key和value
     *
     * @param c    集合
     * @param func 转化函数
     * @param <K>  K类型
     * @param <V>  V类型，集合元素类型
     * @return 转化后的map
     */
    public static <K, V, Z> Map<K, List<Z>> transformNew2(Collection<V> c, Function<V, K> func, Function<V, Z> func1) {

        if (CollectionUtils.isEmpty(c)) {
            return Collections.EMPTY_MAP;
        }
        Map<K, List<Z>> map = new HashMap<K, List<Z>>();
        for (V v : c) {
            K key = func.apply(v);
            List<Z> list = map.get(key);
            if (CollectionUtils.isEmpty(list)){
                list = new ArrayList<Z>();
            }
            list.add(func1.apply(v));
            map.put(key, list);
        }
        return map;
    }

    public static <T> Map<T, T> listKeyMap(List<T> list) {
        Map<T, T> map = Maps.uniqueIndex(list, new Function<T, T>() {
            @Override
            public T apply(T t) {
                return t;
            }
        });

        return map;
    }


}
